/**
 * 路由配置模块
 * 负责整个Vue应用的路由定义、路由守卫、预加载策略和缓存管理
 */
import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw, RouteLocationNormalized } from 'vue-router'

// 预加载关键路由组件的函数
const preloadCriticalRoutes = () => {
  // 预加载策略：
  // 1. 中频访问页面优先预加载 - 提升登录后的核心体验
  // 2. 低频访问页面根据资源大小和重要性选择性预加载
  Promise.all([
    // 中频访问页面 - 优先预加载
    import(/* webpackChunkName: "medium_freq-main" */ '../views/Home.vue'),
    import(/* webpackChunkName: "medium_freq-work" */ '../views/subhome/Work.vue'),
    
    // 低频访问页面 - 选择性预加载
    import(/* webpackChunkName: "low_freq-user-layout" */ '../views/homelink/User.vue')
    // Company页面可以不立即预加载，等用户明确需要时再加载
  ]).catch(err => {
    console.warn('预加载路由组件失败:', err)
  })
}

// 路由缓存管理
const cachedRoutes = new Set<string>()

// 缓存路由的函数
export const cacheRoute = (routeName: string) => {
  cachedRoutes.add(routeName)
}

// 清除路由缓存的函数
export const uncacheRoute = (routeName: string) => {
  cachedRoutes.delete(routeName)
}

// 检查路由是否被缓存
export const isRouteCached = (routeName: string): boolean => {
  return cachedRoutes.has(routeName)
}

// 清除所有路由缓存
export const clearAllRouteCache = () => {
  cachedRoutes.clear()
}

// 路由分组策略：按照访问频率分组，优化代码分割
const routes: RouteRecordRaw[] = [
  // 高频访问组 - 基础页面 (首屏加载后立即加载)
  {
    path: '/login',
    name: 'Login',
    component: () => import(/* webpackChunkName: "high_freq-login" */ '../views/Login.vue'),
    meta: { 
      requiresAuth: false,
      cacheable: false, // 登录页面不需要缓存
      accessFrequency: 'high' // 标记访问频率
    }
  },
  {
    path: '/',
    name: 'Show',
    component: () => import(/* webpackChunkName: "high_freq-home" */ '../views/Show.vue'),
    meta: { 
      requiresAuth: false,
      cacheable: true, // 首页可以缓存
      accessFrequency: 'high' // 标记访问频率
    }
  },
  {    
    path: '/try',
    name: 'Try',
    component: () => import(/* webpackChunkName: "high_freq-try" */ '../views/Try.vue'),
    meta: { 
      requiresAuth: false, // 无需登录即可访问
      cacheable: true, // Try页面可以缓存
      accessFrequency: 'high' // 标记访问频率
    }
  },
  // 验证组件测试页面路由
  {    
    path: '/verify',
    name: 'Verify',
    component: () => import(/* webpackChunkName: "high_freq-verify" */ '../views/VerificationTest.vue'),
    meta: { 
      requiresAuth: false, // 无需登录即可访问
      cacheable: true, // 验证页面可以缓存
      accessFrequency: 'high' // 标记访问频率
    }
  },
  
  // 中频访问组 - 核心功能页面 (登录后加载)
  {    
    path: '/home',
    name: 'Home',
    component: () => import(/* webpackChunkName: "medium_freq-main" */ '../views/Home.vue'),
    meta: { 
      requiresAuth: true,
      cacheable: true, // 主页面可以缓存
      accessFrequency: 'medium', // 标记访问频率
      layout: 'PageLayoutH', // 使用PageLayoutH布局
      title: 'MentorX AI创业助手' // 页面标题
    },
    children: [
      {
        path: '',  // 默认子页面
        name: 'Work',
        component: () => import(/* webpackChunkName: "medium_freq-work" */ '../views/subhome/Work.vue'),
        meta: { 
          cacheable: true, // 工作页面可以缓存
          accessFrequency: 'medium' // 标记访问频率
        }
      }
    ]
  },
  
  // 低频访问组 - 功能页面 (按需加载)
   {   
     path: '/market',    
     name: 'Market',    
     component: () => import('../views/market/Market.vue'),    
     meta: { requiresAuth: true,
       cacheable: true, // 市场页面可以缓存
       accessFrequency: 'low' // 标记访问频率
     }  
    },
  {    
    path: '/user',
    name: 'User',
    component: () => import(/* webpackChunkName: "low_freq-user-layout" */ '../views/homelink/User.vue'),
    meta: { 
      requiresAuth: true,
      cacheable: true, // 用户布局可以缓存
      accessFrequency: 'low', // 标记访问频率
      layout: 'PageLayoutH', // 使用PageLayoutH布局
      title: '用户管理' // 页面标题
    },
    children: [
      {
        path: '',  // 默认子页面 - 直接显示当前用户的信息
        name: 'UserProfile',
        component: () => import(/* webpackChunkName: "low_freq-user-profile" */ '../views/subuser/userid.vue'),
        meta: { 
          cacheable: true, // 用户信息页面可以缓存
          accessFrequency: 'low' // 标记访问频率
        }
      }
    ]
  },
  {    
    path: '/company',
    name: 'Company',
    component: () => import(/* webpackChunkName: "low_freq-company-layout" */ '../views/homelink/Company.vue'),
    meta: { 
      requiresAuth: true,
      cacheable: true, // 公司布局可以缓存
      accessFrequency: 'low', // 标记访问频率
      layout: 'PageLayoutH', // 使用PageLayoutH布局
      title: '公司管理' // 页面标题
    },
    children: [
      {
        path: '',  // 默认子页面
        name: 'CompanyId',
        component: () => import(/* webpackChunkName: "low_freq-company-id" */ '../views/subcompany/companyid.vue'),
        meta: { 
          cacheable: true, // 公司详情页面可以缓存
          accessFrequency: 'low' // 标记访问频率
        }
      },
      {
        path: 'departments',
        name: 'Departments',
        component: () => import(/* webpackChunkName: "low_freq-company-departments" */ '../views/subcompany/departments.vue'),
        meta: { 
          cacheable: true, // 部门管理页面可以缓存
          accessFrequency: 'low' // 标记访问频率
        }
      }
    ]
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes,
  // 配置滚动行为，提升用户体验
  scrollBehavior: (to, from, savedPosition) => {
    // 如果有保存的位置，则恢复到该位置
    if (savedPosition) {
      return savedPosition
    }
    // 否则滚动到顶部
    return {
      top: 0,
      behavior: 'smooth'
    }
  }
})

// 预计算常量，避免运行时重复创建
const PUBLIC_PATHS = new Set(['/login', '/'])
const LOGIN_PATH = '/login'
const ROOT_PATH = '/'

// 路由守卫优化版
router.beforeEach((to, from, next) => {
  // 快速路径：公共路径直接放行，避免后续检查
  if (PUBLIC_PATHS.has(to.path)) {
    next()
    return
  }
  
  // 获取并缓存用户登录状态检查结果
  const isLoggedIn = localStorage.getItem('user') !== null
  
  // 优化：检查路由是否需要身份验证，使用短路逻辑提前返回
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth === true)
  
  // 身份验证处理逻辑
  if (requiresAuth && !isLoggedIn) {
    // 需要认证但未登录，重定向到登录页
    next({ path: LOGIN_PATH, query: { redirect: to.path } })
    return
  }
  
  // 所有其他情况直接放行
  next()
  
  // 异步预加载关键路由，不会阻塞当前路由跳转
  if ((to.path === LOGIN_PATH || (to.path === ROOT_PATH && isLoggedIn))) {
    // 延迟预加载，确保当前路由已完全进入
    setTimeout(() => {
      preloadCriticalRoutes()
    }, 100)
  }
})



// 路由导航后处理
router.afterEach((to, from) => {
  // 对于标记为可缓存的路由，添加到缓存集合中
  if (to.meta.cacheable !== false && to.name) {
    cacheRoute(to.name.toString())
  }
  
  // 可以在这里添加其他路由后处理逻辑
})

export default router
